/*
 * Copyright 2012 Christian Schindelhauer, Peter Thiemann, Faisal Aslam, Luminous Fennell and Gidon Ernst.
 * All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This code is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3
 * only, as published by the Free Software Foundation.
 * 
 * This code is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 3 for more details (a copy is
 * included in the LICENSE file that accompanied this code).
 * 
 * You should have received a copy of the GNU General Public License
 * version 3 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 * 
 * Please contact Faisal Aslam 
 * (faisal.aslam AT gmail.com)
 * if you need additional information or have any questions.
 */
package takatuka.util;

/**
 * 
 * Description:
 * <p>
 * What opcode correspond to what mnemonic. It could be different from what is
 * defined by Java specification as we reused unused opcodes and my define customized
 * instructions.
 * </p> 
 * @author Faisal Aslam
 * @version 1.0
 */
public class OpcodeMnemonicInUse implements Comparable<OpcodeMnemonicInUse> {

    public String mnemonic = null;
    public int opCode = -1;

    public OpcodeMnemonicInUse(String mnemonic, int opCode) {
        this.mnemonic = mnemonic;
        this.opCode = opCode;
    }

    @Override
    public int compareTo(OpcodeMnemonicInUse o) {
        if (mnemonic != null) {
            return mnemonic.compareTo(o.mnemonic);
        } else {
            return (new Integer(opCode).compareTo(o.opCode));
        }
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null && !(obj instanceof OpcodeMnemonicInUse)) {
            return false;
        }
        OpcodeMnemonicInUse input = (OpcodeMnemonicInUse)obj;
        if (input.mnemonic.equals(mnemonic) && input.opCode == opCode) {
            return true;
        }
        return false; 
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 41 * hash + (this.mnemonic != null ? this.mnemonic.hashCode() : 0);
        hash = 41 * hash + this.opCode;
        return hash;
    }

    @Override
    public String toString() {
        return opCode+"="+mnemonic+"\n";
    }

}
